iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
自我挑戰組

程式小萌新的學習筆記系列 第 27

貳柒。Auto-increment id 的另一個選擇 - hashids

  • 分享至 

  • xImage
  •  

今天來介紹一個還蠻好用的 id 種類,Auto-increment 算是資料庫預設的 id 配置,十分簡單直覺。
但久了會發現一些小缺點,就是外部使用者其實是可以知道流水號目前編到哪裡?
有的時候會讓一些有心人士可以旁敲側擊知道一些系統的資訊,例如會員增長的速度、某些品項的商品數量之類的
這時候就蠻適合今天要推薦的這個 id~ hashids~~~~~ (請配樂老師幫我下多拉ㄟ夢掏出道具的音效 登登登登登~ ?)

進入主題

看到 Hashids 的名字中的 hash,第一印象可能會是這東西會幫你把一串 id hash 成另一個看不懂的字串的感覺。但其實套件作者有說,這其實不是真正的雜湊,只是想要有雜湊的那個感覺而已。而且假如真的是 hash 的話,那所有的數字 id 都經過 hash 產生一個可以預期的結果,那其實還是可以逆推回原本的數字,就沒意義了。

所以 hashids 比較像是一種編碼,只是其他人不曉得背後的編碼規則,自然就無法得知背後的數字是多少了

另外一個額外的好處就是,一般我們使用 uuid 或是隨機亂數生成 id 的時候,它其實是沒有規律的,也沒辦法透過 id 去做排序,然後也有可能發生 id 碰撞 (說是風險很低不用擔心,但系統還是需要花時間檢查是否有重複 id?),但這個 hashids 的背後其實還是使用 Auto-increment ID,所以不用擔心碰撞的問題,可以放心使用。

使用方法

很簡單進入 Hashids 官網之後點選你想使用的程式語言就可以找到對應的套件了。目前可支援 JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Perl 6, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, OCaml, Elixir, Rust, Smalltalk, ColdFusion, Kotlin, Nim, VBA, Haxe, Crystal, Elm, ActionScript, Bash, R, TSQL, PostgreSQL, PLpgSQL, Dart, Io, Julia, .NET 應該幾乎都涵蓋到了吧?

以下使用 JavaScript 舉例 (來自官網範例)

var hashids = new Hashids("this is my salt"),
id = hashids.encode(1, 2, 3),
numbers = hashids.decode(id);

首先透過 new Hashids(xxx) 來建立產生 hashid 的轉換器,裡面的 xxx 就是你所使用的鹽,作用跟密鑰差不多,一旦其他人知道你使用 hashids 也知道鹽的設定值,那他們就可以破解你的 hashids,所以使用的時候還是要注意不要讓 "this is my salt" 這段程式碼被其他人知道,千萬不要在前端頁面使用,因為前端沒有秘密可言。

至於後面的 encode(1,2,3) 應該看得出來是帶入數字,然後生成 hashid
然後 decode(hashid) 就是反向把 hashid 轉回當初的數字了

今天的分享到這裡,還剩下三天,我們明天再見~


上一篇
貳陸。如何在程式改版的同時維持兼容性?
下一篇
貳捌。新手後端的技能樹 (for Laravel)
系列文
程式小萌新的學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
sixwings
iT邦研究生 4 級 ‧ 2022-10-01 23:01:50

Emoji 測試
????

我要留言

立即登入留言